/*
 * np_logging.h
 *
 *  Created on: Nov 22, 2010
 *      Author: jeff_zheng
 *   Copyright: NetPerform Technology
 */

#ifndef NP_LOGGING_H_
#define NP_LOGGING_H_

#ifdef __cplusplus
extern "C" {
#endif


typedef enum np_log_level_e
{
	NP_LOG_LEVEL_CRIT		= 0,
	NP_LOG_LEVEL_ERR		= 1,
	NP_LOG_LEVEL_NOTICE		= 2,
	NP_LOG_LEVEL_INFO		= 3,
	NP_LOG_LEVEL_DEBUG		= 4,
}np_log_level_t;

extern int g_np_log_level;

static inline void np_log_level_set(np_log_level_t level) { g_np_log_level = level; };
static inline void np_log_level_incr() { g_np_log_level = (int)g_np_log_level + 1; };

#define NP_LOG_PRE_TASK(lvl)	do { if(g_np_log_level>=(lvl)){ \
							char np_logtmstr[32];\
							np_str_from_time(np_time_get_time(), np_logtmstr, sizeof(np_logtmstr));

#define NP_LOG_TM_FMT		"[%s][TSC:%10u]"
#define NP_LOG_TM_PARAM()	np_logtmstr,np_tsc32_get()
#define NP_LOG_END_TASK()	} } while(0);

#define NP_NO_SYSLOG

#if 1
#define NP_INFO(fmt, ...)
#else

#define NP_INFO(fmt, ...)		NP_LOG_PRE_TASK(NP_LOG_LEVEL_INFO); \
								fprintf(stderr,"[INF]"NP_LOG_TM_FMT fmt"\n", NP_LOG_TM_PARAM(), ## __VA_ARGS__);\
								NP_LOG_END_TASK();
#endif

#define NP_LOG(fmt, ...)		NP_LOG_PRE_TASK(NP_LOG_LEVEL_NOTICE); \
								fprintf(stderr,"[LOG]"NP_LOG_TM_FMT fmt"\n", NP_LOG_TM_PARAM(), ## __VA_ARGS__);\
								NP_LOG_END_TASK();
#define NP_ERR(fmt, ...)		NP_LOG_PRE_TASK(NP_LOG_LEVEL_ERR); \
								fprintf(stderr,"[ERR]"NP_LOG_TM_FMT fmt"\n", NP_LOG_TM_PARAM(), ## __VA_ARGS__);\
								NP_LOG_END_TASK();
#define NP_CRIT(fmt, ...)		NP_LOG_PRE_TASK(NP_LOG_LEVEL_CRIT); \
								fprintf(stderr,"[CRI]"NP_LOG_TM_FMT fmt"\n", NP_LOG_TM_PARAM(), ## __VA_ARGS__);\
								NP_LOG_END_TASK();
#if 1
#  define NP_TRACE(fmt, ...)	NP_LOG_PRE_TASK(NP_LOG_LEVEL_INFO); fprintf(stderr,"[TRC]"NP_LOG_TM_FMT fmt"\n", NP_LOG_TM_PARAM(), ## __VA_ARGS__);NP_LOG_END_TASK();
#  define NP_DEBUG(fmt, ...)	NP_LOG_PRE_TASK(NP_LOG_LEVEL_DEBUG); fprintf(stderr,"[DBG]"NP_LOG_TM_FMT fmt"\n", NP_LOG_TM_PARAM(), ## __VA_ARGS__);NP_LOG_END_TASK();
#else
#  define NP_TRACE(fmt, ...)
#  define NP_DEBUG(fmt, ...)
#endif





#ifdef __cplusplus
}
#endif

#endif /* NP_LOGGING_H_ */
